package com.wfs.lucene;

import com.sun.org.apache.bcel.internal.util.ClassPath;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import java.io.File;
import java.io.IOException;
import java.net.URL;

public class CreateIndexTest {

    public static void main(String[] args) throws IOException {
        String parent= System.getProperty("user.dir")+ File.separator+"src"+File.separator+"main"+File.separator+
                "resources"+  File.separator+"lucene"+  File.separator;
        // 项目data目录: data
        String dataDir =parent+"data";
        // 索引存储位置：open-class-index
        String indexDir = parent+ "index";
        //索引存储目录
        Directory dir =FSDirectory.open(new File(indexDir).toPath());
        // 索引写入器 依赖 的配置信息对象，构造方法中的StandardAnalyzer 是一个标准的分析器
        //分析器主要用在 索引阶段，分析文档中词 和其他功能
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new StandardAnalyzer());
        // 注意：设置为非复合存储索引，如果不设置的话，索引的数据将被打包进 .cfs .cfe .si文件内。
        indexWriterConfig.setUseCompoundFile(false);
        IndexWriter writer = new IndexWriter(dir, indexWriterConfig);
        //获取 data文件路径下子文件
        File[] files = new File(dataDir).listFiles();
        for (File file : files) {
            if (file.isDirectory() || file.isHidden() || !file.exists() || !file.canRead()){
                //去除文件件、隐藏文件、不存在的文件、不可读的文件
                continue;
            }
            String name = file.getName();
            String path = file.getPath();
            String contents = FileUtils.readFileToString(file,"utf-8");
            Document doc = new Document();
            doc.add(new TextField("fileName", name, Field.Store.YES));
            doc.add(new StringField("path", path, Field.Store.YES));
            doc.add(new TextField("contents", contents, Field.Store.NO));
            writer.addDocument(doc);
        }
        //关闭写入器 内部隐含一个commit操作，会将内存缓冲的索引数据刷盘至目录。
        writer.close();
    }

}
